/**
 * qccr.com Inc.
 * Copyright (c) 2018-2020 All Rights Reserved.
 */

import java.io.Serializable;
import java.util.Arrays;

/**
 * @author whf
 * @version $: _03随机函数.java v1.0  2024-12-15 11:14:15  Exp $
 */
public class _03随机函数 {

    // 经典面试题: 知道a,b的随机函数,如何实现c,d. 先把ab随机函数弄成一个0,1等概率, 然后再使用二进制移位获取, 最后再加减即可
    // 其中会用到一个思想,如果出现某个数不在范围内则需要重新调用,使用do while很合适
    public static void main(String[] args) {
        int count = 1000000;
        // double a = 0.64;
        // int res = 0;
        // for (int i = 0; i < count; i++) {
        //     if (random() < a) {
        //         res++;
        //     }
        // }
        // System.out.println((double)res/count);

        // int res = 0;
        // for (int i = 0; i < count; i++) {
        //     if (random3to6() < 4) {
        //         res++;
        //     }
        // }
        // System.out.println((double)res/count);

        int[] arrCount = new int[7];
        for (int i = 0; i < count; i++) {
            arrCount[random7to13() - 7]++;
        }
        System.out.println(count / 7);
        System.out.println("======================分割线======================");
        Arrays.stream(arrCount).forEach(x -> System.out.println(x + " "));

    }

    static int random7to13() {
        int i;
        do {
            i = random0to7();
        } while (i == 7);
        return i + 7;
    }

    // 有坑,注意括号,要不然移位是以前值移位
    static int random0to7(){
        return (binary() << 2) + (binary() << 1) + binary();
    }

    static int binary() {
        double v;
        do {
             v = random3to6();
        } while (v > 4 && v < 5);
        return v < 4 ? 0 : 1;
    }


    static double random3to6() {
        return random() * 3 + 3;
    }

    static double random() {
        return Math.random();
    }
}
